home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 April / PCWorld_2007-04_cd.bin / audio-video / kmplayer / kmp.exe / Shader / EdgeSharpen v1_1(jim ro).txt < prev    next >
Text File  |  2006-09-08  |  2KB  |  66 lines

  1. // EdgeSharpen v1.1 ( jim.ro )=ps_2_0
  2. // http://www.homecinema-fr.com/forum/viewtopic.php?t=29814317 
  3.  
  4. sampler s0 : register(s0); 
  5. float4 p0 : register(c0); 
  6. float4 p1 : register(c1); 
  7.  
  8. #define width (p0[0]) 
  9. #define height (p0[1]) 
  10. #define counter (p0[2]) 
  11. #define clock (p0[3]) 
  12. #define one_over_width (p1[0]) 
  13. #define one_over_height (p1[1]) 
  14.  
  15. #define PI acos(-1) 
  16.  
  17. #define NbPixel      1 
  18.  
  19. #define Edge_threshold       0.2 
  20.  
  21. #define Sharpen_val0       2.0 
  22. #define Sharpen_val1       0.125 
  23.  
  24. float4 main(float2 tex : TEXCOORD0) : COLOR 
  25. // taille de NbPixel pixels 
  26. float dx = NbPixel/width; 
  27. float dy = NbPixel/height; 
  28. float4 Res = 0; 
  29.  
  30. // D├⌐tection de contour par Prewitt 
  31.    // r├⌐cupp├⌐ration des 9 points 
  32.    //   [ 1, 2, 3 ] 
  33.    //   [ 4, 0, 5 ] 
  34.    //   [ 6, 7, 8 ] 
  35.    float4 c0 = tex2D(s0, tex); 
  36.    float4 c1 = tex2D(s0, tex + float2(-dx,-dy)); 
  37.    float4 c2 = tex2D(s0, tex + float2(0,-dy)); 
  38.    float4 c3 = tex2D(s0, tex + float2(dx,-dy)); 
  39.    float4 c4 = tex2D(s0, tex + float2(-dx,0)); 
  40.    float4 c5 = tex2D(s0, tex + float2(dx,0)); 
  41.    float4 c6 = tex2D(s0, tex + float2(-dx,dy)); 
  42.    float4 c7 = tex2D(s0, tex + float2(0,dy)); 
  43.    float4 c8 = tex2D(s0, tex + float2(dx,dy)); 
  44.  
  45.    // Calcul des 3 vecteurs d├⌐riv├⌐ (hor,vert, diag1, diag2) 
  46.    float4 delta1 = (c6+c4+c1-c3-c5-c8); 
  47.    float4 delta2 = (c4+c1+c2-c5-c8-c7); 
  48.    float4 delta3 = (c1+c2+c3-c8-c7-c6); 
  49.    float4 delta4 = (c2+c3+c5-c7-c6-c4); 
  50.  
  51.    // calcul du Prewitt 
  52.    float value = length(abs(delta1) + abs(delta2) + abs(delta3) + abs(delta4))/6; 
  53.  
  54. // Si c'est un contour (vector lenght > Edge_threshold) => filtre de sharpen 
  55.    if(value > Edge_threshold ) 
  56.    { 
  57.       Res = c0 * Sharpen_val0 - (c1 + c2 + c3 + c4 + c5 + c6 + c7 + c8 ) * Sharpen_val1 ; 
  58.       // Pour voir les contour en rouge ... 
  59.       //Res = float4( 1.0, 0.0, 0.0, 0.0 ); 
  60.  
  61.       return Res; 
  62.    } 
  63.    else 
  64.       return c0; 
  65. }